home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Graphics / Viewers / aa_m68k_Intel_Only / ToyViewer1.2 / Source / mag2pxo.tproj / magbmap.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-09-21  |  2.8 KB  |  119 lines

  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <stdio.h>
  4. #include <libc.h>
  5.  
  6. #include "mag.h"
  7.  
  8. static struct {
  9.     unsigned char dx, dy;
  10. } idxtab[16] = {
  11.     { 0, 0 }, { 2, 0 }, { 4, 0 }, { 8, 0 },
  12.     { 0, 1 }, { 2, 1 },
  13.     { 0, 2 }, { 2, 2 }, { 4, 2 },
  14.     { 0, 4 }, { 2, 4 }, { 4, 4 },
  15.     { 0, 8 }, { 2, 8 }, { 4, 8 },
  16.     { 0, 16}
  17. };
  18.  
  19. int magDecode(FILE *fp, FILE *fw, magHeader *mh, long base)
  20. {
  21.     unsigned char    *flagA, *Ap, *Bp;
  22.     int    i, x, y, amask, vbufp, color;
  23.     int    xwidth, /* mh->xbytewidth * 8 */
  24.         xiter,    /* 256¿§⁄˛¬ò„ñ¡¢ mh->xbytewidth*2 */
  25.         /* 16¿§⁄˛¬ò„ñ¡¢˘²⁄ë„⁄ì1byte⁄‹£†¥²¥ˆ¥¨˚‹⁄¹⁄«⁄Ø¡¢£–¥Ø¥⁄¥ú⁄ˇ
  26.            (xbytewidth*4)byte ⁄˙„‰¹fi⁄¦⁄ò⁄º¡£256¿§⁄˛¬ò„ñ⁄ˇ
  27.            (xbytewidth*8)byte. •º¶²¡¢£–¥Ø¥⁄¥ú⁄ˇ (xiter*4)byte. */
  28.         xbyte;    /* xiter*4 */
  29.     long    w;
  30.     unsigned char    flagbuf[FlagBufMAX];
  31.     unsigned char    vbuf[17][MaxImageSize];
  32.     int    green;
  33.  
  34. /* PX original Format
  35.     PX            : Header
  36.     Width Height Colors
  37.     Palette        : Binary
  38.     Bitmap        : Binary
  39. */
  40.     color = mh->is256c ? 256 : 16;
  41.     fprintf(fw, "PX\n");
  42.     if (mh->memo && mh->memo[0])
  43.         fprintf(fw, "#%s\n", mh->memo);
  44.     fprintf(fw, "%d %d %d\n", mh->xbitwidth, mh->yheight, color - 1);
  45.     for (i = 0; i < color; i++) {    /* Palette */
  46.         green = getc(fp);
  47.         putc(getc(fp), fw); /* RED */
  48.         putc(green   , fw); /* GREEN */
  49.         putc(getc(fp), fw); /* BLUE */
  50.     }
  51.  
  52.     w = mh->pixeloffset - mh->flagAoffset;
  53.     if ((flagA = (unsigned char *)malloc(w)) == NULL)
  54.         return Err_MEMORY;
  55.     Ap = flagA;
  56.     Bp = flagA + (mh->flagBoffset - mh->flagAoffset);
  57.     // (void)fseek(fp, base + mh->flagAoffset, SEEK_SET);
  58.     for ( ; w > 0; w--)
  59.         *Ap++ = getc(fp);
  60.     Ap = flagA;
  61.     xiter = mh->xbytewidth;
  62.     xwidth = mh->xbytewidth << 3;
  63.     if (mh->is256c)
  64.         xiter *= 2;
  65.     xbyte = xiter * 4;
  66.     bzero((char *)flagbuf, FlagBufMAX);
  67.     amask = 0x80;
  68.     vbufp = 0;
  69.     // (void)fseek(fp, base + mh->pixeloffset, SEEK_SET);
  70.  
  71.     for (y = 0; y < mh->yheight; y++) {
  72.         unsigned char *vp = vbuf[vbufp];
  73.         unsigned char *fb = flagbuf;
  74.         int k, xpos = 0;
  75.         for (x = 0; x < xiter; x++, fb++) {
  76.             int bflag, py;
  77.             unsigned char *q;
  78.             if (*Ap & amask)
  79.                 *fb ^= *Bp++;
  80.             if ((amask >>= 1) == 0)
  81.                 amask = 0x80, Ap++;
  82.             /* £–¥—¥⁄¥¨¡¢£†⁄˜⁄˛¥à¥Ø¥®⁄¸´—⁄•⁄˘£·¥²¥ˆ¥¨⁄ù˘²⁄ì */
  83.             for (k = 0; k < 2; k++) {
  84.                 bflag = (k ? *fb : (*fb >> 4)) & 0x0f;
  85.                 if (bflag == 0) {
  86.                     if (feof(fp)) {
  87.                         free((void *)flagA);
  88.                         return Err_SHORT;
  89.                     }
  90.                     *vp++ = getc(fp);
  91.                     *vp++ = getc(fp);
  92.                 }else {
  93.                     py = vbufp - idxtab[bflag].dy;
  94.                     if (py < 0) py += 17;
  95.                     q = &vbuf[py][xpos - idxtab[bflag].dx];
  96.                     *vp++ = q[0];
  97.                     *vp++ = q[1];
  98.                 }
  99.                 xpos += 2;
  100.             }
  101.         }
  102.         vp = vbuf[vbufp];
  103.         for (k = mh->isDouble ? 2 : 1; k > 0; k--)
  104.             if (mh->is256c) {
  105.                 for (x = 0; x < xwidth; x++, vp++)
  106.                     putc(*vp, fw);
  107.             }else {
  108.                 for (x = 0; x < xwidth; x+=2, vp++) {
  109.                     putc(*vp >> 4, fw);
  110.                     putc(*vp & 0x0f, fw);
  111.                 }
  112.             }
  113.         if (++vbufp >= 17) vbufp = 0;
  114.     }
  115.  
  116.     free((void *)flagA);
  117.     return 0;
  118. }
  119.